Expresiones
Al momento de aprender un lenguaje de programación, asignar variables es de lo más básico que se debe conocer.
Sin embargo, esto en Scala tiene una particularidad: existen 3 formas para declarar expresiones
- Declarar la expresión como una variable, implicando que lo que se asigne allí puede cambiar (es mutable).
Esto se hace convar
. - Declarar la expresión como un valor, implicando que no puede cambiar (es inmutable).
Se hace conval
. - Declarar la expresión como una función, implicando que se ejecutará la asignación de ese recurso cuando se llame.
Se hace condef
.
En resumen:
1 | var a = 5 |
El último ejemplo es bastante trivial y no se logra apreciar el verdadero sentido de la declaración de funciones.
Una función, matemáticamente hablando, es una definición que recibe algo como entrada, lo transforma, y devuelve un resultado.
1 | def pow2(x: Int): Int = { |
Este ejemplo es de la definición de una función que aplica exponente a la 2 a un número. Las funciones pueden recibir otras funciones como argumento de entrada también (Esto se conoce como funciones de orden superior):
1 | def runner(f: Int => Int, in: Int): Unit = { |
(La s
al inicio del String en el println
es para permitir la interpolación, se usa para permitir escribir internamente con declaraciones hechas antes).
Muchas veces, aquellas funciones que son tan pequeñas y que son utilizadas como entrada de otras funciones pueden escribirse como funciones anónimas, en otros lenguajes se les conoce como lambdas:
1 | runner( x => x * x, 5) |
Dentro de un class
, una función hace las veces de operador (usando la terminología de programación orientada a objetos).
A diferencia de otros lenguajes como JavaScript, C, o Java, en Scala la palabra return
no es necesaria. El compilador asumirá que el valor final de la expresión es lo que debe retornar. Esto también implica que se debe ser explícito en los valores de retorno. Por ejemplo:
1 | def miFuncion(x: Int) = { |
¿Cual sería el tipo de dato que retorna esta función?, a simple vista, debería ser un tipo Boolean
, pero al no retornarse nada del lado del else
no se puede asumir ningún tipo de dato. Esto nos obliga a tener que responder ante todas las posibilidades, este es un principio que también se usa en otro tipo de cosas como los match
.
Es decir que la función debe quedar así:
1 | def miFuncion(x: Int): Boolean = { |
Aunque es un ejemplo algo forzado, la idea de tener que responder a todos los posibles caminos, hace que la definición de la función esté completa, o en términos más matemáticos, que sea una función “pura”.
Resumen
- Las expresiones pueden ser variables, valores, o funciones.
- Las funciones pueden pasarse como argumentos (funciones de orden superior).
- Scala permite escribir funciones anónimas.
- Las funciones deberían contemplar todos los posibles casos.